package org.example.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import java.io.IOException;
import java.util.Date;

/**
 * @Description: 滑动时间
 * @Author:曹震
 * @Date: 2024/11/23 13:47
 */@Component
public class JwtTime extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

        String token = request.getHeader("Authorization");
        System.out.println(token);
        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7);  // 去除 "Bearer " 前缀

            try {
                Claims claims = parseToken(token);  // 解析并验证 Token

                // 如果 Token 即将过期，延长过期时间
                if (isTokenExpiringSoon(claims)) {
                    // 延长 Token 的过期时间
                    String extendedToken = extendTokenExpiration(token, claims);
                    response.setHeader("Authorization", "Bearer " + extendedToken);
                }

                // 将用户信息放入请求属性中，供后续使用
                request.setAttribute("user", claims.getSubject());
            } catch (JwtException e) {
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                response.getWriter().write("Invalid or expired token");
                return;
            }
        }

        filterChain.doFilter(request, response);  // 继续请求处理
    }

//        @Value("CAOZHEN_SG")
        private String secretKey="CAOXHEN_SG";

        private static final long EXTEND_TIME = 1000 * 60 * 30;  // 每次请求延长过期时间：30分钟
        // 解析 Token 并验证其有效性
        private Claims parseToken(String token) {
            return Jwts.parser()
                    .setSigningKey(secretKey)
                    .build()
                    .parseClaimsJws(token)
                    .getBody();
        }

        // 判断 Token 是否快要过期
        private boolean isTokenExpiringSoon(Claims claims) {
            Date expirationDate = claims.getExpiration();
            long timeLeft = expirationDate.getTime() - System.currentTimeMillis();
            return timeLeft < EXTEND_TIME;  // 如果剩余时间小于 30 分钟，则视为即将过期
        }

        // 延长 Token 的过期时间
        private String extendTokenExpiration(String token, Claims claims) {
            // 获取原始的 Token 数据
            String username = claims.getSubject();
            long newExpirationTime = System.currentTimeMillis() + EXTEND_TIME;

            // 生成新的 Token，延长过期时间
            return Jwts.builder()
                    .setSubject(username)
                    .setIssuedAt(new Date())  // 设置为当前时间
                    .setExpiration(new Date(newExpirationTime))  // 延长过期时间
                    .signWith(SignatureAlgorithm.HS256, secretKey)
                    .compact();
        }


    }


